package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.domain.Permission;
import cn.wolfcode.qo.JsonResult;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContext;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * Created by wolfcode-lanxw
 */
public class CheckPermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(handler instanceof HandlerMethod){
            Employee currentUser = UserContext.getCurrentUser();
            //判断是否超级管理员
            if(currentUser.isAdmin()){
                return true;
            }
            //来到这步，不是超级管理员
            HandlerMethod method = (HandlerMethod) handler;
            //获取当前请求方法上的注解
            RequiredPermission methodAnnotation = method.getMethodAnnotation(RequiredPermission.class);
            if(methodAnnotation==null){
                //方法上没有贴注解,不需要权限控制，直接放行
                return true;
            }
            //来到这步，说明当前方法需要权限控制
            String expression = methodAnnotation.expression();
            //TODO 登录的时候需要根据用户id查询出该用户拥有权限集合，放入到session
            List<Permission> permissionList = UserContext.getCurrentPermissions();
            //遍历用户的权限集合，判断当前方法的权限是否在用户权限集合中.
            //new ArrayList()
            // NULL
            for(Permission p:permissionList){
                if(p.getExpression().equals(expression)){
                    //说明用户拥有这个权限，直接放行
                    return true;
                }
            }
            //循环完都没有找到，说明用户的权限集合中并没有当前访问方法的权限. 没有权限进行拦截
            //针对不同情况进行处理,根据当前访问方法是否有贴@ResponseBody注解判断是哪种请求
            ResponseBody methodAnnotation1 = method.getMethodAnnotation(ResponseBody.class);
            if(methodAnnotation1==null){
                //1.页面请求
                //request.getRequestDispatcher("/WEB-INF/views/common/nopermission.ftl").forward(request,response);
                response.sendRedirect("/nopermission");
            }else{
                //2.JSON数据的请求
                response.setContentType("application/json;charset=utf-8");
                String responseData = JSON.toJSONString(new JsonResult(false,"您没有权限操作"));
                response.getWriter().write(responseData);
            }
            return false;
        }
        return true ;
    }
}
